println ack(0,0); // 1
println ack(0, 1); // 2
println ack(1, 1); // 3
println ack(3, 4); // 2^(n + 3) - 3  = 125
println ack(3, 6); // 2^(n + 3) - 3  = 509
//print Ack(3, 8); // 2^(n + 3) - 3  = 2045
//print Ack(3, 9); // 2^(n + 3) - 3  = 4093
ack(4, 0); // 13

// from: http://rosettacode.org/wiki/Ack_function#Groovy
def ack ( m, n ) {
    //assert m >= 0 && n >= 0 : 'both arguments must be non-negative'
    m == 0 ? n + 1 : n == 0 ? ack(m-1, 1) : ack(m-1, ack(m, n-1))
}
